package state

import "fmt"

// State 封装与Context的一个特定状态相关的行为
type State interface {
	// Handle 状态对应的处理, 可以传入参数
	Handle(sampleParameter string)
	NextState() State
}

// ConcreteStateA 实现一个与context的一个特定状态相关的行为
type ConcreteStateA struct {
}

// Handle 实现具体的处理
func (c *ConcreteStateA) Handle(sampleParameter string) {
	fmt.Println("stateA " + sampleParameter)
}

func (c *ConcreteStateA) NextState() State {
	return &ConcreteStateB{}
}

// ConcreteStateB 实现一个与context的一个特定状态相关的行为
type ConcreteStateB struct {
}

// Handle 实现具体的处理
func (c *ConcreteStateB) Handle(sampleParameter string) {
	fmt.Println("stateB " + sampleParameter)
}

func (c *ConcreteStateB) NextState() State {
	return &ConcreteStateA{}
}

// Context 定义客户感兴趣的接口，通常会维护一个state类型的对象实例
type Context struct {
	// 持有一个State类型的对象示例
	state State
}

func (c *Context) SetState(state State) {
	c.state = state
}

// Request 用户感兴趣的接口方法
func (c *Context) Request(sampleParameter string) {
	// 在处理中，会转调state来处理
	c.state.Handle(sampleParameter)
	c.SetState(c.state.NextState())
}
